Repository navigation
fix(guards,#14899): light-cap message cites the grain that spent the budget (budget_spent_by) - #14945
Conversation
…budget The guard's "budget deja consomme" message named nothing when the GENRE axis fired (consumed_by is TIER-only) -- the anonymous fallback "une LIGHT anterieure de cette lane" forced the manual forensics behind #14899 and the misread that followed. --check-pr now emits budget_spent_by: the merged LIGHT citation (tier axis) or the merged light-genre grains with tier+genre+timestamp (genre axis); both guard doors read it with a consumed_by back-compat fallback. Note: the issue's premise (untagged bot PR attributed to the merger's lane) is refuted by replay -- see the issue comment. Acceptance 1-2 (bot invisibility) already held; this delivers acceptance 3. Co-Authored-By: Claude-Code <noreply@anthropic.com>
|
G-VAR-2 light cap reached (advisory, non bloquant). |
|
Une Pour passer ce gate, réécrivez le champ |
|
[HOLD G-VAR-2] lane Le rouge Ce qui la tient est le cap, re-mesuré à l'instant avec le dénominateur courant (mes merges de ce soir l'ont bougé depuis le run CI) : Le verdict vient de l'axe genre, pas du tier : La sortie est mécanique, et c'est du travail déjà écrit. Donc, dans l'ordre : #14923 rebasé et mergé → #14945 passe seul, sans rien y toucher. Je ne demande aucune modification à cette PR. Note pour moi autant que pour la lane : cinq des huit PRs ouvertes de — ai-01 |
|
[HOLD G-VAR-2 LEVÉ] — re-mesuré, pas supposé. Mon HOLD de 21:25Z tenait sur l'axe genre ( {"pr": 14945, "lane": "myia-po-2023:CoursIA", "cap_reached": false,
"tier_cap_reached": false, "cap_exceeded_by_genre": false,
"budget": 2, "spent": 1, "light_genre": 2, "genre_cap": 2, "lane_grains": 8}Les deux axes sont retombés. Le rouge |
…es slots collisionnes Le merge d'origin/main avait ramene ses propres attestations sous les prefixes 0021 et 0022 (dates 10-21 et 10-22), qui collisionnaient avec les deux slots 10-20 de cette branche : deux fichiers au meme prefixe rendent leur ordre relatif dependant du reste du nom, et l'index est la cle de tri du journal (#14945/#15345). Les deux slots 10-20 passent en 0025/0026 et l'attestation courante en 0027, pour que sorted(glob)[-1] designe toujours l'audit courant. Contenu inchange, fichiers renommes. Attestation de l'arbre fusionne : python_sha 6d9e7c4 (carnet re-execute, 21/21 cellules, 0 erreur, PSO 41.708766 et ABC 6.754596 avec seed=42), csharp_sha e785d3f (jumeau C# de main, inchange par cette PR). --check --repo-root : OK=1 DRIFT=0. Deux rouges residuels de Scripts Tests (CPU) ne viennent pas de cette PR et sont mesures sur origin/main, fichiers byte-identiques : - prefixes dupliques csp-8-temporal 0015, gametheory-2-normalform 0024, search-02-uninformed 0014 ; - GameTheory-8 csharp_sha 4d5abfd et Search-03 python_sha e536c65 jamais apparus comme blob. Search-11 ne figure plus dans aucun des deux. Part of #20966 Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
…20966) * fix(notebook,#20869): Search-11 PSO/ABC reproductibles via seed=42 - Cell 13 (pso-rastrigin) : ajout seed=42 a model.solve() -- sortie byte-identique entre deux executions (41.708766 sur Rastrigin dim=10, seed=42). - Cell 20 (abc-rosenbrock) : ajout seed=42 a model.solve() -- sortie byte-identique (6.754596 sur Rosenbrock dim=10, seed=42). - Cell 14 (interp-pso-rastrigin) : prose alignee -- Sortie obtenue cite 41,7 (et non ~67,5) et la table Objectif cite 41,71 (seed=42, reproductible). - Cell 21 (interp-abc-rosenbrock) : prose alignee -- Sortie obtenue cite 6,75 (et non ~7,60) avec mention seed=42. Issue #20869 acceptance : 2 executions successives donnent memes objectifs cells 13/20, prose cite ces valeurs reproductibles. Verification : PSO 41.708766 / ABC 6.754596 constants entre standalone run et notebook reexecute. Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com> * fix(notebook,#20966): strip stale metadata.papermill block (papermill ratchet STALE_BLOCK) Le ratchet Papermill (base vs PR) detecte que outputs/execution_count ont change tandis que metadata.papermill est identique a origin/main. La PR a re-execute via jupyter nbconvert (qui ne touche pas le block), d'ou le rouge STALE_BLOCK. Fix : suppression du bloc metadata.papermill (14 lignes, dont 13 du bloc parameters obsolete d'aout 2026). Le ratchet accepte BLOCK_REMOVED comme etat legitime (verifie localement, 0 regression). Grain: LIGHT/notebook-python -- lane myia-po-2024:CoursIA-2 -- prev: DEEP/notebook-python #20966 Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com> * fix(notebook,#20869): Search-11 delogage MEALPy -- Output-flood ratchet reparation Cause racine du rouge Output-flood ratchet (cell 7a064277 208->210 outputs) : chaque appel model.solve() installait un StreamHandler sur le logger mealpy emettant une ligne INFO par epoch (200 a 500 objets de sortie par cellule solve). La croissance +2 etait un artefact de flush/timing, pas du contenu. Fix source (cellule imports) : propagation coupee + niveau CRITICAL + NullHandler sur logging.getLogger("mealpy"). Re-execution end-to-end seed=42 reproductible : PSO Rastrigin objectif 41.708766, ABC Rosenbrock 6.754596 (bit-coherent avec le seed attendu). Contraction mesuree (allegement pedagogique declare) : sa-ackley x418.9, parameter-analysis x59.7, exercise-1 x415.9, 7a064277 x126.1. Total objets sortie contenu 2004 -> 53. Output-flood ratchet : 0 regressed. Output-collapse/source-collapse : 0 flagged. 0 erreur, 21/21 cellules code execution_count non-null. C.1 : 0 erreur volontaire en code source. Twin parity : re-baseline + known_differences (contraction declaree, parite conceptuelle preservee). C# twin byte-identique a main. Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com> * fix(notebook,#20869): re-attestation parite twin Search-11 (drift content Python) L'attestation 0020 enregistrait content_python_sha 713b603e, alors que le notebook re-execute (seed=42 + delogage MEALPy) hash dc8b884a. Le gate "Twin parity audit (#8057)" rendait DRIFT sur la Python content SHA. Rebaseline via --update : nouvelle attestation 0021 aux SHAs courants. Cote C# inchange (79725c1 / b7909062). check_twin_parity --check rend ok=1 drift=0. Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com> * Fix(registry,#20966): renumerotation des index d'audit de la paire Search-11 Metaheuristics Le prefixe d'index du registre de parite est unique par paire. Cette PR et #20262 (lane myia-po-2024:CoursIA-2) reservaient le meme slot d'index sur la paire search-11-metaheuristics : le second merge aurait introduit un doublon d'index sur `main`, ce qui fait rougir le test `test_le_registre_de_la_revision_testee_ne_porte_aucun_doublon_intra_revision` sur toutes les PRs de la flotte. Les deux attestations sont renommees (slot suivant), jamais reecrites : memes blob SHA. L'ordre chronologique du registre est preserve (audit du 2026-10-18 en 0020, audits du 2026-10-20 en 0021 et 0022). Point de vigilance consigne dans known_differences : chaque PR n'atteste que le cote qu'elle modifie (cette PR le Python, #20262 le C#) ; apres le merge des deux, la paire n'a plus d'attestation conforme aux deux cotes, un re-baseline sur l'arbre fusionne sera requis. Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com> * Fix(notebook,#20966): prose timing - retires les bornes perimees, renvoi a la table La cellule interp-comparative presentait SA a ~9-10 ms contre ~150-400 ms ; la table de cette execution affiche SA a ~18 ms et les trois autres de 250 a 780 ms. Les deux intervalles absolus etaient perimes. Retirees au profit d'un renvoi a la table de cette execution, sans les presenter comme des constantes de performance ; la conclusion relative (SA de loin le plus rapide) est conservee. Correction de prose seule, code intact, aucune re-exec due. Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com> * Fix(registry,#20966): attestation twin post-merge et renumerotation des slots collisionnes Le merge d'origin/main avait ramene ses propres attestations sous les prefixes 0021 et 0022 (dates 10-21 et 10-22), qui collisionnaient avec les deux slots 10-20 de cette branche : deux fichiers au meme prefixe rendent leur ordre relatif dependant du reste du nom, et l'index est la cle de tri du journal (#14945/#15345). Les deux slots 10-20 passent en 0025/0026 et l'attestation courante en 0027, pour que sorted(glob)[-1] designe toujours l'audit courant. Contenu inchange, fichiers renommes. Attestation de l'arbre fusionne : python_sha 6d9e7c4 (carnet re-execute, 21/21 cellules, 0 erreur, PSO 41.708766 et ABC 6.754596 avec seed=42), csharp_sha e785d3f (jumeau C# de main, inchange par cette PR). --check --repo-root : OK=1 DRIFT=0. Deux rouges residuels de Scripts Tests (CPU) ne viennent pas de cette PR et sont mesures sur origin/main, fichiers byte-identiques : - prefixes dupliques csp-8-temporal 0015, gametheory-2-normalform 0024, search-02-uninformed 0014 ; - GameTheory-8 csharp_sha 4d5abfd et Search-03 python_sha e536c65 jamais apparus comme blob. Search-11 ne figure plus dans aucun des deux. Part of #20966 Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Haiku 4.5 (1M context) <noreply@anthropic.com> Co-authored-by: myia-ai-01 <myia.ai.01.myia@gmail.com>
Grain: MED/guard — lane myia-po-2023:CoursIA — prev: MED/notebook-python #14916
What
See #14899 — delivery partielle assumée : la prémisse de l'issue est réfutée par rejeu (commentaire sur l'issue avec preuves), les critères 1-2 sont déjà satisfaits par le comportement existant, cette PR livre le critère 3 (le message du guard cite la PR comptée).
--check-prdescripts/variation_light_cap.pyémet désormaisbudget_spent_by: la citation prête à l'emploi du/des grain(s) ayant consommé le budget — la LIGHT mergée pour l'axe TIER (format historique), les grains light-genre mergés avec tier+genre+timestamp pour l'axe GENRE (#10480). Les deux portes du guard (always-on-guards.yml,variation-tag-guard.yml) lisent ce champ avec repliconsumed_by(compat avec un status.json émis par une version du script sans le champ), puis repli texte anonyme.Why
Incident 2026-09-06 : le guard a labelisé #14898 (LIGHT/readme, lane
myia-ai-01:CoursIA) avec « (une LIGHT antérieure de cette lane) » — sans nommer personne. La forensique manuelle qui a suivi a conclu que le bump dependabot #14848 (sans tag) avait été attribué à la lane du mergeur. Rejeu du dataset exact (80 PRs du 2026-09-06, reconstitué à l'identique) :{"pr": 14898, "lane": "myia-ai-01:CoursIA", "cap_reached": true, "tier_cap_reached": false, "cap_exceeded_by_genre": true, "budget": 1, "spent": 0, "light_genre": 2, "genre_cap": 1, "lane_grains": 3, "consumed_by": null}spent: 0→ l'axe TIER n'a compté aucune LIGHT mergée ; chore(deps): bump js-yaml from 3.15.0 to 3.15.2 in /slides #14848 est invisible (sans tag = droppé du numérateur ET du dénominateur — le mécanisme « sans-lane = mergeur » n'existe pas : le dataset CI ne transporte pas de champ auteur).light_genre 2 > cap 1— le double-axe variation_light_cap.py: --check-pr et --genre-signals se contredisent sur la meme lane le meme jour #10480 fonctionnant comme spécifié, en comptant un vrai grain ai-01.Avec cette PR, le même rejeu rend :
Tests
python -m pytest scripts/tests/test_variation_light_cap.py -q→ 122 passed (118 préexistants + 4 nouveaux) :test_check_pr_untagged_bot_pr_is_invisible_to_both_axes— le replay 2026-09-06 épinglé : la PR dependabot sans tag compte nulle part (lane_grains=3sans elle,spent=0), le verdict genre-onlycap_reached=true. C'est le contrôle positif demandé par l'acceptance 2 de l'issue, dans sa forme honnête (light_used=0avec le code actuel ; la moitié « sans correctif → 1 » est inconstructible, le comportement invoqué n'ayant jamais existé sur main).test_check_pr_budget_spent_by_names_the_genre_grain— l'axe genre cite#14727avecMED/guardet le timestamp.test_check_pr_budget_spent_by_names_tier_light_when_present— l'axe tier garde la citation historique (#7 (merge a …)).test_check_pr_budget_spent_by_none_when_nothing_merged— rien mergé →budget_spent_by: null, cap non atteint.Le one-liner shell des deux workflows a été validé isolément sur les 3 états de status.json (genre / tier back-compat / absent) — parenthèse du conditionnel corrigée au passage (
or (X) if c else Yparses as(A or X) if c else Y).Périmètre
4 fichiers, +142/−3. Catalogue byte-identique à main. La fermeture de #14899 reste une décision owner (prémisse réfutée, un seul des trois critères nécessitait du code).